import { pgTable, uuid, varchar, smallint, boolean, uniqueIndex } from 'drizzle-orm/pg-core';
import { sql } from 'drizzle-orm';
import { MENU_TYPE } from '@nbase/shared';
import { auditFields } from './audit-fields';

/**
 * 系统-菜单表
 */
export const sysMenu = pgTable(
  'sys_menu',
  {
    /** 菜单ID（主键） */
    id: uuid('id').primaryKey().default(sql`uuidv7()`),
    /** 菜单名称 */
    name: varchar('name', { length: 128 }).notNull(),
    /** 权限标识（唯一） */
    permission: varchar('permission', { length: 128 }).notNull(),
    /** 类型（1.菜单 2.按钮） */
    type: smallint('type').notNull().default(MENU_TYPE.MENU),
    /** 排序 */
    sort: smallint('sort').notNull().default(0),
    /** 父菜单ID */
    parentId: uuid('parent_id'),
    /** 路由路径 */
    path: varchar('path', { length: 256 }),
    /** 图标 */
    icon: varchar('icon', { length: 128 }),
    /** 组件路径 */
    component: varchar('component', { length: 256 }),
    /** 是否可见 */
    visible: boolean('visible').notNull().default(true),
    /** 是否缓存 */
    keepAlive: boolean('keep_alive').notNull().default(false),
    ...auditFields(),
  },
  (table) => [
    uniqueIndex('sys_menu_permission_unique_idx').on(table.permission),
  ]
);

export type SysMenu = typeof sysMenu.$inferSelect;
export type NewSysMenu = typeof sysMenu.$inferInsert;

